package com.conselheiro.web.beans;

import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

import com.conselheiro.web.control.LazyEntidadeDataModel;
import com.conselheiro.web.entidade.Relato;
import com.conselheiro.web.entidade.Usuario;
import com.conselheiro.web.entidade.enumeration.TipoPost;
import com.conselheiro.web.gamefication.GerenciadorNiveis;

@ManagedBean
@ViewScoped
public class PerfilBean extends AbstractBean {

	private static final long serialVersionUID = 1527288504068494689L;
	private LazyDataModel<Relato> relatoDataModel = getRelatoDataModel();
	private LazyDataModel<Relato> conselhoDataModel = getConselhoDataModel();
	private LazyDataModel<Relato> linhaDoTempoDataModel = getLinhaDoTempoDataModel();
	private Usuario usuario;
	private long relatosTotais;
	private long conselhosTotais;
	private String nivelUsuario;
	private String areaInteresse;
	private Relato relato;
	private long idUsuario;
	private TipoExibicao tipoExibicao = TipoExibicao.RELATOS;

	public void carregarDadosUsuario() {
		setRelatosTotais(getFachada().getTotalRelatosUsuario(getUsuario().getLogin()));
		
		setConselhosTotais(getFachada().getTotalConselhosUsuario(getUsuario().getLogin()));
		setNivelUsuario(GerenciadorNiveis
				.getClassificacaoUsuario(getConselhosTotais()));

		TipoPost areaInteresseUsuario = getFachada().getAreaInteresseUsuario(
				getUsuario().getLogin());
		setAreaInteresse(areaInteresseUsuario == null ? "-"
				: areaInteresseUsuario.getDescricao());
	}
	
	public enum TipoExibicao {
		LINHA_DO_TEMPO, RELATOS, CONSELHOS
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public String getNivelUsuario() {
		return nivelUsuario;
	}

	public void setNivelUsuario(String nivelUsuario) {
		this.nivelUsuario = nivelUsuario;
	}

	public long getRelatosTotais() {
		return relatosTotais;
	}

	public void setRelatosTotais(long totalRelatos) {
		this.relatosTotais = totalRelatos;
	}

	public long getConselhosTotais() {
		return conselhosTotais;
	}

	public void setConselhosTotais(long totalConselhos) {
		this.conselhosTotais = totalConselhos;
	}

	public String getAreaInteresse() {
		return areaInteresse;
	}

	public void setAreaInteresse(String areaInteresse) {
		this.areaInteresse = areaInteresse;
	}

	public TipoExibicao getTipoExibicao() {
		return tipoExibicao;
	}

	public void setTipoExibicao(TipoExibicao tipoExibicao) {
		this.tipoExibicao = tipoExibicao;
	}

	public void setExibicao(String tipoExibicao) {
		setTipoExibicao(TipoExibicao.valueOf(tipoExibicao));
	}

	public long getIdUsuario() {
		return idUsuario;
	}

	public void setIdUsuario(long idUsuario) {
		this.idUsuario = idUsuario;
		setUsuario(getFachada().getUsuario(getIdUsuario()));
		carregarDadosUsuario();
	}

	public Relato getRelato() {
		return relato;
	}

	public void setRelato(Relato relato) {
		this.relato = relato;
	}

	public LazyDataModel<Relato> getRelatosParaExibicao() {
		switch (getTipoExibicao()) {
		case CONSELHOS:
			return conselhoDataModel;
		case RELATOS:
			return relatoDataModel;
		case LINHA_DO_TEMPO:
			return linhaDoTempoDataModel;
		default:
			return null;
		}
	}

	private LazyDataModel<Relato> getLinhaDoTempoDataModel() {
		return new LazyEntidadeDataModel<Relato>() {

			private static final long serialVersionUID = -6404311389526290515L;

			@Override
			public Relato getRowData(String rowKey) {
				return getFachada().getRelato(Long.parseLong(rowKey));
			}

			@Override
			public List<Relato> load(int first, int pageSize, String sortField,
					SortOrder sortOrder, Map<String, String> filters) {
				if (usuario == null)
					setUsuario(getFachada().getUsuario(getIdUsuario()));
				List<Relato> linhaDoTempoPorUsuario = getFachada()
						.getLinhaDoTempoPorUsuario(usuario, first, pageSize);
				setRowCount(linhaDoTempoPorUsuario.size());
				return linhaDoTempoPorUsuario;
			}
		};
	}

	private LazyDataModel<Relato> getRelatoDataModel() {
		return new LazyEntidadeDataModel<Relato>() {

			private static final long serialVersionUID = -6404311389526290515L;

			@Override
			public Relato getRowData(String rowKey) {
				return getFachada().getRelato(Long.parseLong(rowKey));
			}

			@Override
			public List<Relato> load(int first, int pageSize, String sortField,
					SortOrder sortOrder, Map<String, String> filters) {
				if (usuario == null)
					setUsuario(getFachada().getUsuario(getIdUsuario()));
				List<Relato> relatosPorUsuario = getFachada()
						.getRelatosPorUsuario(usuario, first, pageSize);
				setRowCount(relatosPorUsuario.size());
				return relatosPorUsuario;
			}
		};
	}

	private LazyDataModel<Relato> getConselhoDataModel() {
		return new LazyEntidadeDataModel<Relato>() {

			private static final long serialVersionUID = -6404311389526290515L;

			@Override
			public Relato getRowData(String rowKey) {
				return getFachada().getRelato(Long.parseLong(rowKey));
			}

			@Override
			public List<Relato> load(int first, int pageSize, String sortField,
					SortOrder sortOrder, Map<String, String> filters) {
				if (usuario == null)
					setUsuario(getFachada().getUsuario(getIdUsuario()));
				List<Relato> relatosAconselhadosPorUsuario = getFachada()
						.getRelatosAconselhadosPorUsuario(usuario, first,
								pageSize);
				setRowCount(relatosAconselhadosPorUsuario.size());
				return relatosAconselhadosPorUsuario;
			}
		};
	}

}
